DML Country
Home

DML Country

DML Country

CRUD stored procedures voor de Country tabel. De afspraak is dat de namen voor de stored procedurs beginnen met de naam van de tabel gevolgd door de naam van de CRUD handeling. De naam wordt in pascalnotatie geschreven.

Probleem

We moeten de gegevens van een land kunnen inserten, updaten, deleten en selecteren. De selectie moet kunnen gebeuren op basis van de naam en van de code.

Design

Naam Beschrijving
CountryInsert bevat 1 OUTPUT parameter om de nieuw Id te retourneren naar het calling programma
CountryUpdate deze stored procedure updatet alle kolommen van de rij met de opgegeven Id
CountrySelectOne lees 1 rij in uit de tabel op basis van de Id, neem alle kolommen mee voor het detail venster
CountrySelectAll lees alle rijen in uit de tabel maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model)
CountrySelectByCode lees 1 rij in uit de tabel op basis van de Code maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model)
CountrySelectByName ees 1 rij in uit de tabel op basis van de Name maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model)

Oplossing

Insert

De Insert stored procedure voegt een nieuwe rij toe. In de DDL hebben we de Id kolom gedeclareerd als een IDENTITY(1,1) kolom. Dat wil zeggen dat de waarde met 1 wordt vermeerderd als we een rij toevoegen. Als vanuit C# of PHP een call maken naar deze procedure kan het nodig zijn om de nieuwe Id te kennen. Vermits het een stored procedure is en geen functie, kan deze geen waarde retourneren en hebben we een OUTPUT parameter nodig om de waarde van de nieuwe idee naar C# of PHP terug te sturen. In de parameterlijst voegen we dus een OUTPUT parameter toe met de naam Id waarin we de waarde van de Id kolom stoppen van de nieuw toegevoegde rij.

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Sunday 3rd of January 2016 02:28:16 PM
-- DML Insert Stored Procedure for Country 
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'CountryInsert'))
BEGIN
    DROP PROCEDURE CountryInsert
END
GO
CREATE PROCEDURE "CountryInsert"
(
    @Code NVARCHAR (2) ,
    @Latitude FLOAT ,
    @Longitude FLOAT ,
    @Name NVARCHAR (255) ,
    @ShippingCostMultiplier FLOAT ,
    @Id INT  output
)
AS
BEGIN
INSERT INTO "Country"
    (
        "Country"."Code",
        "Country"."Latitude",
        "Country"."Longitude",
        "Country"."Name",
        "Country"."ShippingCostMultiplier"
    )
    VALUES
    (
        @Code,
        @Latitude,
        @Longitude,
        @Name,
        @ShippingCostMultiplier
    );
    set @Id = SCOPE_IDENTITY();
END 
GO

We proberen de Insert stored procedure uit. We beginnen met een variabele te declareren die de output parameter van de stored procedure moet opvangen en vervolgens tonen we de waarde ervan met de PRINT instructie. Als we die test twee keer na elkaar uitvoeren, krijgen we een foutmelding omdat we geen twee keer dezelfde code en/of naam kunnen toevoegen. Dat komt door de UNIQUE constraint op de kolom Code en Name.

declare @NewId int

exec CountryInsert 'BE', 56, 50.8333, 'Belgium', 1, @NewId OUTPUT
print @NewId
exec CountryInsert 'BZ',84, 17.25, 'Belize', 1.5, @NewId OUTPUT
print @NewId
exec CountryInsert 'BJ', 204, 9.5, 'Benin', 1.5, @NewId OUTPUT
print @NewId
exec CountryInsert 'BM', 60, 32.3333, 'Bermuda', 1.5, @NewId OUTPUT
print @NewId
exec CountryInsert 'BT', 64, 27.5, 'Bhutan', 1.5, @NewId OUTPUT
print @NewId
exec CountryInsert 'BO', 68, -17, 'Bolivia; Plurinational State of', 1.5, @NewId OUTPUT
print @NewId
exec CountryInsert 'BA', 70, 44, 'Bosnia and Herzegovina', 1.5, @NewId OUTPUT
print @NewId
exec CountryInsert 'BW', 72, -22, 'Botswana', 1.5, @NewId OUTPUT
print @NewId
exec CountryInsert 'BV', 74, -54.4333, 'Bouvet Island', 1.5, @NewId OUTPUT
print @NewId
exec CountryInsert 'BR', 76, -10, 'Brazil', 1.5, @NewId OUTPUT

Update

De Update stored procedure neemt de Id van de rij die geüpdated moet worden als argument.

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Sunday 3rd of January 2016 02:28:16 PM
-- DML Update Stored Procedure for Country
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'CountryUpdate'))
BEGIN
    DROP PROCEDURE CountryUpdate
END
GO
CREATE PROCEDURE "CountryUpdate"
(
    @Code NVARCHAR (2) ,
    @Latitude FLOAT ,
    @Longitude FLOAT ,
    @Name NVARCHAR (255) ,
    @ShippingCostMultiplier FLOAT ,
    @Id INT 
)
AS
BEGIN
UPDATE "Country"
    SET
        "Code" = @Code,
        "Latitude" = @Latitude,
        "Longitude" = @Longitude,
        "Name" = @Name,
        "ShippingCostMultiplier" = @ShippingCostMultiplier
    WHERE "Country"."Id" = @Id;
END 
GO

Een voorbeeld:

exec CountryUpdate 'BE', 56, 50.8333, 'België', 1.1, 1

Deze stored procedure wijzigt de verzendingskost factor. De rest van de kolommen behouden hun oorspronkelijke waarden, maar je moet ze wel meegeven omdat de stored procedures deze als argumenten verwacht.

CountryUpdate Stored Procedure Test
CountryUpdate Stored Procedure Test

Delete

De Delete stored procedure neemt de Id van de rij die gedeleted moet worden als argument.

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Sunday 3rd of January 2016 02:28:16 PM
-- DML Delete Stored Procedure for Country 
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'CountryDelete'))
BEGIN
    DROP PROCEDURE CountryDelete
END
GO
CREATE PROCEDURE "CountryDelete"
(
     @Id INT 
)
AS
BEGIN
DELETE FROM "Country"
    WHERE "Country"."Id" = @Id;
END 
GO

Een voorbeeld:

exec CountryDelete 1
CountryDelete Stored Procedure Test
CountryDelete Stored Procedure Test

We voegen België opnieuw toe. Let erop dat de Id anders is dan de vorige keer:

CountryInsert Stored Procedure Test Reinsert
CountryInsert Stored Procedure Test Reinsert

SelectOne

De SelectOne stored procedure haald de rij met de opgegeven Id uit de tabel op.

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Sunday 3rd of January 2016 02:28:16 PM
-- DML SelectOne Stored Procedure for Country 
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'CountrySelectOne'))
BEGIN
    DROP PROCEDURE CountrySelectOne
END
GO
CREATE PROCEDURE "CountrySelectOne"
(
     @Id INT 
)
AS
BEGIN
SELECT * FROM "Country"
    WHERE "Country"."Id" = @Id;
END 
GO

Zoals altijd testen we de stored procedure:

exec CountrySelectOne 5
CountrySelectOne Stored Procedure Test
CountrySelectOne Stored Procedure Test

SelectAll

Over de SelectAll valt niet veel te zeggen. De stored procedure neemt geen argumenten aan en retourneert alle rijen uit de tabel.

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Sunday 3rd of January 2016 02:28:16 PM
-- DML SelectAll Stored Procedure for table Country 
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'CountrySelectAll'))
BEGIN
    DROP PROCEDURE CountrySelectAll
END
GO
CREATE PROCEDURE "CountrySelectAll"
AS
BEGIN
SELECT "Country"."Code",
    "Country"."Name",
    "Country"."ShippingCostMultiplier",
    "Country"."Id"
    FROM "Country"
    ORDER BY "Name";
END 
GO
CountrySelectAll Stored Procedure Test
CountrySelectAll Stored Procedure Test

SelectByCode

We voegen ook een stored procedure toe om op de Code van het land te zoeken.

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Sunday 3rd of January 2016 02:28:16 PM
-- DML SelectByCode Stored Procedure for table Country
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'CountrySelectByCode'))
BEGIN
    DROP PROCEDURE CountrySelectByCode
END
GO
CREATE PROCEDURE "CountrySelectByCode"
(
     @Code NVARCHAR (2) 
)
AS
BEGIN
SELECT "Country"."Code",
    "Country"."Name",
    "Country"."ShippingCostMultiplier",
    "Country"."Id"

    FROM "Country"
    WHERE "Country"."Code" = @Code
    ORDER BY "Country"."Code";
END 
GO
CountrySelectByCode Stored Procedure Test
CountrySelectByCode Stored Procedure Test

SelectByName

Voor de volledigheid voegen we tenslotte een stored procedure toe om op de naam van het land te kunnen zoeken.

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Sunday 3rd of January 2016 02:28:16 PM
-- DML SelectByName Stored Procedure for table Country
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'CountrySelectByName'))
BEGIN
    DROP PROCEDURE CountrySelectByName
END
GO
CREATE PROCEDURE "CountrySelectByName"
(
     @Name NVARCHAR (255) 
)
AS
BEGIN
SELECT "Country"."Code",
    "Country"."Name",
    "Country"."ShippingCostMultiplier",
    "Country"."Id"

    FROM "Country"
    WHERE "Country"."Name" = @Name
    ORDER BY "Country"."Name";
END 
GO
CountrySelectByName Stored Procedure Test
CountrySelectByName Stored Procedure Test

JI
2017-01-17 21:51:09